//package com.yonyou.gmmc;
//
//import java.lang.reflect.Method;
//
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.slf4j.Logger;
//import org.springframework.stereotype.Component;
//import org.springframework.util.StringUtils;
//
//import com.dianping.cat.Cat;
//import com.dianping.cat.message.Transaction;
//import com.yonyou.gmmc.common.annotation.CatMethodTransaction;
//
//
//@Component
//@Aspect
//public class CatAspect {
//
//	Logger log = org.slf4j.LoggerFactory.getLogger(this.getClass());
//
//	@Pointcut("@annotation(com.yonyou.gmmc.common.annotation.CatMethodTransaction)")
//	// @Pointcut("execution(* com.yonyou.gmmc.common.*(..))")  
//	public void controllerAspect() {
//		System.out.println("我是一个切入点");
//	}
//
//	@Around("controllerAspect()")
//	public Object CatMethodTransaction(ProceedingJoinPoint joinPoint) throws Throwable {
//		Class<? extends Object> object = joinPoint.getTarget().getClass();
//		String methodName = joinPoint.getSignature().getName();
//		Method[] methods = object.getMethods();
//		Method method = null;
//		for (Method m : methods) {
//			if (m.getName().equals(methodName)) {
//				method = m;
//			}
//		}
//		// Object[] args = joinPoint.getArgs();
//		// Class[] parameterTypes=new Class[args.length];
//		// for(int i=0;i<args.length;i++){
//		// parameterTypes[i]=args[i].getClass();
//		// }
//		// method=object.getMethod(methodName,parameterTypes);
//		CatMethodTransaction catMethodTransaction = method.getAnnotation(CatMethodTransaction.class);
//		// 注解有值的优先以注解的值
//		String type = catMethodTransaction.type();
//		if (StringUtils.isEmpty(type))
//			type = object.getSimpleName();
//		String name = catMethodTransaction.name();
//		// 类名+方法名
//		if (StringUtils.isEmpty(name))
//			name = type + "." + methodName;
//		return aroundTransaction(type, name, joinPoint);
//	}
//
//	private Object aroundTransaction(String type, String name, ProceedingJoinPoint joinPoint) throws Throwable {
//		Object result = null;
//		Transaction transaction = null;
//		// 不让cat异常导致业务异常
//		try {
//			transaction = Cat.getProducer().newTransaction(type, name);
//		} catch (Exception e) {
//			log.error("Cat.getProducer().newTransaction Error", e);
//		}
//		try {
//			log.info("大众点评cat拦截：type=" + type + ";name=" + name);
//			result = joinPoint.proceed();
//			if (transaction != null)
//				transaction.setStatus(Transaction.SUCCESS);
//		} catch (Throwable throwable) {
//			if (transaction != null)
//				transaction.setStatus(throwable);
//			log.error("aroundTransaction exception", throwable);
//			throw throwable;
//		} finally {
//			if (transaction != null)
//				transaction.complete();
//		}
//		return result;
//	}
//
//	// @Around("@annotation(com.yonyou.gmmc.common.annotation.CatCacheTransaction)")
//	// public Object catCacheTransactionProcess(ProceedingJoinPoint pjp,
//	// CatCacheTransaction catCacheTransaction) throws Throwable {
//	//
//	//
//	// String transName = pjp.getSignature().getName();
//	// if(StringUtils.isNotBlank(catCacheTransaction.name())){
//	// transName = catCacheTransaction.name();
//	// }
//	// Transaction t = Cat.newTransaction("Cache.Redis",transName);
//	// try {
//	// Cat.logEvent("Cache.Server", catCacheTransaction.server());
//	// Object result = pjp.proceed();
//	// t.setStatus(Transaction.SUCCESS);
//	// return result;
//	// } catch (Throwable e) {
//	// Cat.logEvent("Cache.Server", catCacheTransaction.server(), "-1", null);
//	// t.setStatus(e);
//	// throw e;
//	// }finally{
//	// t.complete();
//	// }
//	// }
//
//	// @After("@annotation(catHttpRequestTransaction)")
//	// public void catHttpRequestProcess(CatHttpRequestTransaction
//	// catHttpRequestTransaction) {
//	// HttpServletRequest request = ((ServletRequestAttributes)
//	// RequestContextHolder.getRequestAttributes()).getRequest();
//	// if(StringUtils.isNotBlank(catHttpRequestTransaction.name())){
//	// String transName = catHttpRequestTransaction.name();
//	// request.setAttribute("cat-page-uri", transName);
//	// }
//	// }
//}